package com.hundsun.cprs.yyt.service.common.service;

import java.util.List;
import java.util.Map;

import com.hundsun.cprs.yyt.common.exception.ServiceCodeException;
import com.hundsun.cprs.yyt.common.exception.ServiceException;
import com.hundsun.cprs.yyt.response.BaseResponse;
import com.hundsun.cprs.yyt.service.common.dto.*;

/**
 * 资金操作内部调用接口，主要接收内部请求参数，转换成资金的请求参数
 * 
 * @author linbo
 * @version $Id: RemoteTradeFundService.java,v 1.1.1.1-RC1 2017年12月22日 Exp $
 */
public interface RemoteTradeFundService {

	/**
	 * 查询资金账户信息
	 * 
	 * @param tradeFundInfo
	 * @return TradeFundSearchResult
	 */
	public TradeFundSearchResult searchFundAccountAmount(TradeFundInfo tradeFundInfo);
	
	/**
	 * 获取有效的银行列表信息--仅单渠道适用
	 */
	public List<FundBankInfo> getAvailableBankList();

	/**
	 * 获取有效的银行列表信息--多渠道模式下适用
	 * @param type 01-入金 02-出金
	 * @return
	 */
	public List<FundBankInfo> getMultiAvailableBankList(String type);
	
	/**
	 * 根据资金账号获取资金情况
	 * @param fundAccount
	 * @return
	 */
	public FundMoneyInfo getFundMoneyInfoByFundAccount(String fundAccount);
	
	
	/**
	 * 根据资金账号返回银行账号信息
	 * @param fundAccount
	 * @return
	 */
	public FundBankAccountInfo getBankAccountDetailByFundAccount(String fundAccount);
	
	/**
	 * 出金
	 * @param fundAccount
	 * @param amount		出金金额(元)
	 */
	public FundCommResponse fundOut(FundOutInRequest reqeust);
	
	/**
	 * 入金
	 * @param fundAccount
	 * @param amount		入金金额(元)
	 */
	public FundCommResponse fundIn(FundOutInRequest request);
	
	
	/**
	 * 资金账号开户绑卡
	 * @param openInfo
	 */
	public FundCommResponse open(FundOpenInfo openInfo);

	/**
	 * 资金解绑
	 * @param closeInfo
	 * @return
	 */
	public FundCommResponse close(FundCloseInfo closeInfo);
	
	/**
	 * 资金账户签约接口
	 * @param openInfo
	 */
	public void preOpen(FundOpenInfo openInfo);
	
	/**
	 * 根据账号类型，获取指定银行渠道下的支持的银行列表
	 * @param accountType	
	 * @param bankProCode
	 * @return
	 */
	public List<FundBankClientNo> getBankClientNoList(String accountType,String bankProCode);
	
	/**
	 * 根据会员ID判断资金账户是否已开户
	 * @param userId
	 * @return	true - 已开户  false - 未开户
	 */
	public boolean checkFundAccountStatus(Long userId);
	
	
	/**
	 * 根据会员ID 获取开户签约绑卡状态
	 * @param userId
	 * @return
	 */
	public FundOpenStatus getFundAccountStatus(Long userId);
	
	/**
	 * 取得资金交易日期
	 * @return
	 */
	public String getFundTransDate();
	
	/**
	 * 发送银行渠道相关的验证请求
	 * @param request
	 * @return	返回验证请求相关附加信息
	 */
	FundBankChannelVerificateInfo sendAndGetBankChannelVerificateCode(FundBankChannelVerificateRequest request);
	
	/**
	 * 获取指定银行渠道的相关配置信息
	 * @param bankChannelNo
	 * @return
	 */
	Map<String,String> getConfigInfoByBankChannel(String bankChannelNo);
	
	
	/**
	 * 资金通用性批量操作接口
	 * @param request
	 * @throws ServiceCodeException
	 */
	void batchExecute(FundBatchRequest request) throws ServiceException;
	
	
	/**
	 * 分页查询资金明细
	 */
	FundAccountLogInfoResponse getFundAccountLogByPage(FundAccountLogQuery query);
	
	/**
	 * 根据银行产品代码获取该产品下子渠道信息
	 * @param bankProCode
	 * @return
	 */
	List<FundBankChannelInfo> getBankChannelInfoByBankProCode(String bankProCode);

	/**
	 * 当前资金是否是多渠道
	 * @return
	 */
	boolean isMultichannel();

	/**
	 * 校验多渠道是否需要签约
	 * 仅多渠道下可用
	 * @param fundAccount 资金账号
	 * @param channelBankNo 渠道编号
	 * @param executeCode 01-入金 02-出金
	 * @return
	 */
	boolean checkMultichannelSign(String fundAccount, String channelBankNo, String executeCode);
	/**
	 * 获取充提现备注提示信息
	 * @param action
	 * @param bankProCode
	 * @return
	 */
	String getFundMemo(String action, String bankProCode);
	/**
	 * 资金申请记录查询
	 * @param query
	 * @return
	 */
	FundBankOutInApplyResponse getFundApply(BankFundOutInApplyQuery query);

	/**
	 * 根据账号类型，获取指定银行渠道下的支持的银行列表
	 * @param bankClientNo
	 * @param keyType
	 * @return
	 */
	public List<FundBankParamInfo> getBankParamInfoList(String bankClientNo,String keyType);

	/**
	 * 获取所属银行列表
	 * 双乾支付对接
	 * @param request
	 * @return
	 * */
	public List<FundPaymentInfoResponse> getFundPaymentConfig(FundPaymentInfoRequest request);

	/**
	 * 根据银行的类型，获取该类型下的所有银行
	 *
	 * */
	LJBankResponse getBanks(LJBankRequest request);
	/**
	 * 获取所有省
	 *
	 * */
	LJBankResponse getProveniences();
	/**
	 * 获取省内所有市
	 *
	 * */
	LJBankResponse getCities(LJBankRequest request);
	/**
	 * 获取市内的区
	 *
	 * */
	LJBankResponse getAreas(LJBankRequest request);
	/**
	 * 根据银行、省市区、关键字获取所有联行信息
	 *
	 * */
	LJBankResponse getBankBranchs(LJBankRequest request);
	/**
	 * 根据联行号获取联行信息
	 *
	 * */
	LJBankResponse getBankBranch(LJBankRequest request);
	/**
	 * 判断当前时间是否允许交易（日终期间不允许交易）
	 *
	 * */
	Boolean isTradeAble();
	/**
	 * 获取用户所有可用卡号
	 * （通联支付)
	 * */
	List<FundBankAccountDto> getCanUserSignAccount(FundBankAccountRequest request);
	/**
	 * 删除卡号
	 *（通联支付）
	 * */
	void cancelSignAccount(FundBankAccountRequest request);
}
